package smallfrench.moteur.lexer;

import smallfrench.moteur.lexer.err.ErreurLexer;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.lexer.lexemes.LexemeIdent;
import smallfrench.moteur.lexer.lexemes.TypeLexeme;

/**
 * 
 * @author antoine1023
 *
 */
public class AutomateIdentificateur extends Automate {

	private boolean estValide(char c) {
		return	(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
				(c >= '0' && c <= '9') ||
				c == '_';
	}

	@Override
	public Lexeme analyser(LecteurChaine lecteur, Position debut)
			throws ErreurLexer {

		char c = lecteur.suivant();

		boolean estLettre = (c >= 'a' && c <= 'z')
				|| (c >= 'A' && c <= 'Z');

		if (estLettre || c == '_') {

			StringBuffer bufIdent = new StringBuffer();
			bufIdent.append(c);

			while (!lecteur.isEof()) {
				c = lecteur.suivant();
				if (estValide(c)) {
					bufIdent.append(c);
				} else {
					lecteur.precedent();
					break;
				}
			}
			String ident = bufIdent.toString();
			TypeLexeme type = TypeLexeme.getTypeLexeme(ident);



			if (type == null) {
				return new LexemeIdent(ident, debut, lecteur.getPosition());
			} else {
				return new Lexeme(type, debut, lecteur.getPosition());
			}
		}
		lecteur.precedent();
		return null;
	}

}
